/*	--- 条件测试 --- 

在运行测试的时候，有些时候，我们需要排出某些@Test方法，不要让它运行，这时，我们就可以给它标记一个@Disabled：	*/
@Disabled
@Test
void testBug101() {
	// 这个@Test会读取,但不会运行
}


/*
为什么我们不直接注释掉@Test，而是要加一个@Disabled？这是因为注释掉@Test，JUnit就不知道这是个测试方法，而加上@Disabled，JUnit仍然识别出这是个测试方法，只是暂时不运行。它会在测试结果中显示：	*/
Tests run: 68, Failures: 2, Errors: 0, Skipped: 5


/*
类似@Disabled这种注解就称为条件测试，JUnit根据不同的条件注解，决定是否运行当前的@Test方法。

我们来看一个例子：	*/
public class Config {
	public String getConfigFile(String filename) {
		String os = System.getProperty("os.name").toLowerCase();

		if (os.contains("win")) {
			return "C:\\" + filename;
		}

		if (os.contains("mac") || os.contains("linux") || os.contains("unix")) {
			return "/usr/local/" + filename;
		}

		throw new UnsupportedOperationException();
	}
}

/*
我们想要测试getConfigFile()这个方法，但是在Windows上跑，和在Linux上跑的代码路径不同，因此，针对两个系统的测试方法，其中一个只能在Windows上跑，另一个只能在Mac/Linux上跑：	*/
@Test
void testWindows() {
	assertEquals("C:\\test.ini", config.getConfigFile("test.ini"));
}

@Test
void testLinuxAndMac() {
	assertEquals("/usr/local/test.cfg", config.getConfigFile("test.cfg"));
}




// 因此，我们给上述两个测试方法分别加上条件如下：
@Test 
@EnableOnOs(OS.WINDOWS)
void testWindows() {
	assertEquals("C:\\test.ini", config.getConfigFile("test.ini"));
}

@Test
@EnableOnOs( {OS.LINUX, OS.MAC })
void testLinuxAndMac() {
	assertEquals("/usr/local/test.cfg", config.getConfigFile("test.cfg"));
}



/*
@EnableOnOs就是一个条件测试判断。

我们来看一些常用的条件测试：

不在Windows平台执行的测试，可以加上@DisabledOnOs(OS.WINDOWS)：	*/
@Test
@DisableOnOs(OS.WINDOWS)
void testOnNonWindowsOs() {
	// TODO: this test is disabled on windows
}



// 只能在Java 9或更高版本执行的测试，可以加上@DisabledOnJre(JRE.JAVA_8)：
@Test
@DisableOnJre(JRE.JAVA_8)
void testOnJava90rAbove() {
	// TODO: this test is diabled on java 8
}



// 只能在64位操作系统上执行的测试，可以用@EnabledIfSystemProperty判断：
@Test
@EnabledIfSystemProperty(named = "os.arch", matches = ".*64.*")
void testOnlyOn64bitSystem() {
	// TODO: this test is only run on 64 bit system
}




// 需要传入环境变量DEBUG=true才能执行的测试，可以用@EnabledIfEnvironmentVariable：
@Test
@EnabledIfEnvironmentVariable(named = "DEBUG", matches = "true")
void testOnlyOnDebugMode() {
	// TODO: this test is only run on DEBUG = true
}



// 最后，万能的@EnableIf可以执行任意Java语句并根据返回的boolean决定是否执行测试。下面的代码演示了一个只能在星期日执行的测试：
@Test
@EnabledIf("java.time.LocalDate.now().getDayOfWeek() == java.time.DayOfWeek.SUNDAY")
void testOnlyOnSunday() {
	// TODO: this test is only run on Sunday
}

/* 当我们在JUnit中运行所有测试的时候，JUnit会给出执行的结果。在IDE中，我们能很容易地看到没有执行的测试：

	测试的方法中带有⊘标记的测试方法表示没有执行。


*/



/*	--- 条件测试 の 小结 --- 


1. 条件测试是根据某些注解在运行期让JUnit自动忽略某些测试。
	@Disabled

	@EnabledOnOs(OS.WINDOWS)
	@EnabledOnOs({ OS.LINUX, OS.MAC })

	@DisabledOnOs(OS.WINDOWS)
		不在Windows平台执行的测试

	@DisabledOnJre(JRE.JAVA_8)
		只能在Java 9或更高版本执行的测试

	@EnabledIfSystemProperty(named = "os.arch", matches = ".*64.*")
		只能在64位操作系统上执行的测试

	@EnabledIfEnvironmentVariable(named = "DEBUG", matches = "true")
		需要传入环境变量DEBUG=true才能执行的测试

	@EnabledIf("java.time.LocalDate.now().getDayOfWeek()==java.time.DayOfWeek.SUNDAY")
		万能的@EnableIf可以执行任意Java语句,并根据返回的boolean决定是否执行测试
	
2. 带有⊘标记的测试方法小文件表示没有执行。


*/






















